// Copyright Epic Games, Inc. All Rights Reserved.

#include "MessageProcessors/ElimStreakProcessor.h" // 包含头文件

#include "GameFramework/PlayerState.h" // 包含玩家状态类
#include "Messages/LyraVerbMessage.h" // 包含Lyra动词消息结构体
#include "NativeGameplayTags.h" // 包含原生游戏标签定义

#include UE_INLINE_GENERATED_CPP_BY_NAME(ElimStreakProcessor) // 包含由Unreal Header Tool生成的代码

namespace ElimStreak // 命名空间定义
{
	UE_DEFINE_GAMEPLAY_TAG_STATIC(TAG_Lyra_Elimination_Message, "Lyra.Elimination.Message"); // 定义击杀消息的游戏标签
}

void UElimStreakProcessor::StartListening() // 开始监听消息的函数实现
{
	UGameplayMessageSubsystem& MessageSubsystem = UGameplayMessageSubsystem::Get(this); // 获取游戏消息子系统实例
	AddListenerHandle(MessageSubsystem.RegisterListener(ElimStreak::TAG_Lyra_Elimination_Message, this, &ThisClass::OnEliminationMessage)); // 注册击杀消息监听器
}

void UElimStreakProcessor::OnEliminationMessage(FGameplayTag Channel, const FLyraVerbMessage& Payload) // 处理击杀消息的函数实现
{
	// 为攻击者追踪击杀连胜（除了自我击杀的情况）
	if (Payload.Instigator != Payload.Target) // 如果攻击者和目标不是同一个对象
	{
		if (APlayerState* InstigatorPS = Cast<APlayerState>(Payload.Instigator)) // 尝试将攻击者转换为玩家状态
		{
			int32& StreakCount = PlayerStreakHistory.FindOrAdd(InstigatorPS); // 查找或添加玩家的连胜记录
			StreakCount++; // 增加连胜计数

			if (FGameplayTag* pTag = ElimStreakTags.Find(StreakCount)) // 查找当前连胜次数对应的标签
			{
				FLyraVerbMessage ElimStreakMessage; // 创建新的动词消息
				ElimStreakMessage.Verb = *pTag; // 设置消息动词为找到的标签
				ElimStreakMessage.Instigator = InstigatorPS; // 设置攻击者
				ElimStreakMessage.InstigatorTags = Payload.InstigatorTags; // 设置攻击者标签
				ElimStreakMessage.ContextTags = Payload.ContextTags; // 设置上下文标签
 				ElimStreakMessage.Magnitude = StreakCount; // 设置连胜次数

				UGameplayMessageSubsystem& MessageSubsystem = UGameplayMessageSubsystem::Get(this); // 获取游戏消息子系统实例
				MessageSubsystem.BroadcastMessage(ElimStreakMessage.Verb, ElimStreakMessage); // 广播击杀连胜消息
			}
		}
	}

	// 结束目标的击杀连胜
	if (APlayerState* TargetPS = Cast<APlayerState>(Payload.Target)) // 尝试将目标转换为玩家状态
	{
		PlayerStreakHistory.Remove(TargetPS); // 从连胜记录中移除目标玩家
	}
}